From: Richard M. Stallman Date: Wed, 30 Jun 1993 04:36:37 +0000 (+0000) Subject: (define-key-after): Delete duplicate bindings that come X-Git-Tag: archive/raspbian/1%29.2+1-2+rpi1^2~5^2~95133 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/www.github.com/%22bookmarks:///%22http:/www.example.com/cgi/%22https:/www.github.com/%22bookmarks:/?a=commitdiff_plain;h=113d28a8a0590b47854ff9bd53996e47940e1ca2;p=emacs.git (define-key-after): Delete duplicate bindings that come after the new one. Do insert when we reach the end, if haven't before. --- diff --git a/lisp/subr.el b/lisp/subr.el index e7bc2e13a24..23e9da84592 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -189,7 +189,7 @@ of the map. The order matters when the keymap is used as a menu." (or (keymapp keymap) (signal 'wrong-type-argument (list 'keymapp keymap))) - (let ((tail keymap) done + (let ((tail keymap) done inserted (first (aref key 0))) (while (and (not done) tail) ;; Delete any earlier bindings for the same key. @@ -197,11 +197,20 @@ The order matters when the keymap is used as a menu." (setcdr tail (cdr (cdr tail)))) ;; When we reach AFTER's binding, insert the new binding after. ;; If we reach an inherited keymap, insert just before that. + ;; If we reach the end of this keymap, insert at the end. (if (or (eq (car-safe (car tail)) after) - (eq (car tail) 'keymap)) + (eq (car (cdr tail)) 'keymap) + (null (cdr tail))) (progn - (setcdr tail (cons (cons (aref key 0) definition) (cdr tail))) - (setq done t))) + ;; Stop the scan only if we find a parent keymap. + ;; Keep going past the inserted element + ;; so we can delete any duplications that come later. + (if (eq (car (cdr tail)) 'keymap) + (setq done t)) + ;; Don't insert more than once. + (or inserted + (setcdr tail (cons (cons (aref key 0) definition) (cdr tail)))) + (setq inserted t))) (setq tail (cdr tail))))) (defun keyboard-translate (from to)